package service

import (
	"errors"
	"time"

	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/model"
	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/repository"
	"golang.org/x/crypto/bcrypt"
)

// UserService 定义用户服务接口
// 这个接口定义了所有用户业务逻辑的方法

type UserService interface {
	// 用户注册
	Register(username, password, nickname string) (*model.User, error)
	// 用户登录
	Login(username, password string) (*model.User, string, error)
	// 获取用户信息
	GetUserInfo(userID int64) (*model.User, error)
	// 更新用户信息
	UpdateUserInfo(user *model.User) error
}

// userService 实现UserService接口
// 这个结构体封装了用户业务逻辑

type userService struct {
	userRepo repository.UserRepository
}

// NewUserService 创建一个新的用户服务实例
// 参数userRepo是用户仓库接口，用于数据访问
func NewUserService(userRepo repository.UserRepository) UserService {
	return &userService{userRepo: userRepo}
}

// Register 用户注册
// 参数username是用户名，password是密码，nickname是昵称
// 返回创建的用户对象和可能的错误
func (s *userService) Register(username, password, nickname string) (*model.User, error) {
	// 检查用户是否已存在
	existingUser, err := s.userRepo.GetByUsername(username)
	if err != nil {
		return nil, err
	}
	if existingUser != nil {
		return nil, errors.New("用户名已存在")
	}

	// 生成密码哈希
	passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return nil, err
	}

	// 创建用户对象
	user := &model.User{
		Username:     username,
		PasswordHash: string(passwordHash),
		Nickname:     nickname,
		Avatar:       "default_avatar.png",
		CreatedAt:    time.Now(),
		LastLoginAt:  time.Now(),
		// 初始化修仙相关属性，使用默认值
	}

	// 保存用户到数据库
	if err := s.userRepo.Create(user); err != nil {
		return nil, err
	}

	return user, nil
}

// Login 用户登录
// 参数username是用户名，password是密码
// 返回用户对象、JWT令牌和可能的错误
func (s *userService) Login(username, password string) (*model.User, string, error) {
	// 根据用户名查询用户
	user, err := s.userRepo.GetByUsername(username)
	if err != nil {
		return nil, "", err
	}
	if user == nil {
		return nil, "", errors.New("用户名或密码错误")
	}

	// 验证密码
	if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password)); err != nil {
		return nil, "", errors.New("用户名或密码错误")
	}

	// 更新最后登录时间
	user.LastLoginAt = time.Now()
	if err := s.userRepo.Update(user); err != nil {
		return nil, "", err
	}

	// 生成JWT令牌
	// TODO: 实现JWT令牌生成逻辑
	token := "sample_jwt_token"

	return user, token, nil
}

// GetUserInfo 获取用户信息
// 参数userID是用户ID
// 返回用户对象和可能的错误
func (s *userService) GetUserInfo(userID int64) (*model.User, error) {
	// 根据ID查询用户
	user, err := s.userRepo.GetByID(userID)
	if err != nil {
		return nil, err
	}
	if user == nil {
		return nil, errors.New("用户不存在")
	}

	return user, nil
}

// UpdateUserInfo 更新用户信息
// 参数user是包含更新后信息的用户对象
func (s *userService) UpdateUserInfo(user *model.User) error {
	// 检查用户是否存在
	existingUser, err := s.userRepo.GetByID(user.ID)
	if err != nil {
		return err
	}
	if existingUser == nil {
		return errors.New("用户不存在")
	}

	// 更新用户信息
	if err := s.userRepo.Update(user); err != nil {
		return err
	}

	return nil
}